/*
之后都采用接口+映射器绑定的方式，灵活的配置mapper，且一开始就把返回类型确定好。而不是使用预置的select方法，类型不明确，且不方便
 */
package MyMybatis.mapper;

import MyMybatis.entity.Student;
import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        try(SqlSession sqlSession = MybatisUtil.getSession(true)){
            TestMapper mapper = sqlSession.getMapper(TestMapper.class); //直接通过SqlSession的getMapper()方法获取对应接口的实现类
            mapper.selectStudent().forEach(System.out::println);  //通过接口中定义的行为来直接获取结果，返回结果是明确的Student类型的list
            System.out.println(mapper.getClass());  //TestMapper明明是一个我们自己定义接口啊，Mybatis也不可能提前帮我们写了实现类啊，那这接口怎么就出现了一个实现类呢？
            // 我们可以通过调用getClass()方法来看看实现类是个什么,class com.sun.proxy.$Proxy4，加$表示是内部类
            //我们发现，实现类名称很奇怪，名称为com.sun.proxy.$Proxy4，它是通过动态代理生成的，相当于动态生成了一个实现类，而不是预先定义好的，有关Mybatis这一部分的原理，我们放在最后一节进行讲解
        }
    }
}
